shell 练习-获取子进程

说明:本shell题目是一个网友在公众号中提问的,正好利用这个每日习题的机会拿出来让大家一起做一做。

给出一个进程PID,打印出该进程下面的子进程以及子进程下面的所有子进程。(只需要考虑子进程的子进程,再往深层次则不考虑)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#!/bin/bash
read -p "please input a pid number: " p
ps -elf > /tmp/ps.log
is_ppid(){
awk '{print $5}' /tmp/ps.log > /tmp/ps1.log
if ! grep -qw "$1" /tmp/ps1.log
then
echo "PID $1 不是系统进程号,或者它不是父进程"
return 1
fi
}
is_ppid $p
if [ $? -eq "1" ]
then
exit
fi
print_cpid(){
p=$1
awk -v p1=$p '$5 == p1 {print $4}' /tmp/ps.log |sort -n |uniq >/tmp/p1.log
n=`wc -l /tmp/p1.log|awk '{print $1}'`
if [ $n -ne 0 ]
then
echo "PID $p 子进程 pid 如下:"
cat /tmp/p1.log
else
echo "PID $p 没有子进程"
fi
}
print_cpid $p
for cp in `cat /tmp/p1.log`
do
print_cpid $cp
done

另外,一条命令查询的方法是:pstree -p pid